bindings: Export action activation internally
authorEmmanuele Bassi <ebassi@gnome.org>
Wed, 5 Feb 2020 17:06:51 +0000 (17:06 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 19 Mar 2020 03:00:49 +0000 (23:00 -0400)
We're going to use it, just like we use the signal emission code.

gtk/gtkbindings.c
gtk/gtkbindingsprivate.h

index 2c7840981576d6f04f616367fb80f013594739c9..bf7c19accf6db29aba12070ecf842519e69cdfb2 100644 (file)
@@ -724,36 +724,33 @@ gtk_binding_emit_signal (GObject     *object,
   return TRUE;
 }
 
-static gboolean
-binding_signal_activate_action (GtkBindingSignalAction *sig,
-                                const char             *set_name,
-                                guint                   keyval,
-                                GdkModifierType         modifiers,
-                                GObject                *object)
+gboolean
+gtk_binding_activate_action (GObject     *object,
+                             const char  *action,
+                             GVariant    *args,
+                             gboolean    *handled,
+                             GError     **error)
 {
   if (!GTK_IS_WIDGET (object))
     {
-      char *accelerator = gtk_accelerator_name (keyval, modifiers);
-      g_warning ("gtk_binding_entry_activate(): binding \"%s::%s\": "
-                 "actions must be emitted on GtkWidget subtypes, %s is not supported",
-                 set_name, accelerator,
-                 G_OBJECT_TYPE_NAME (object));
-      g_free (accelerator);
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "actions must be emitted on GtkWidget subtypes, \"%s\" is not supported",
+                   G_OBJECT_TYPE_NAME (object));
       return FALSE;
     }
 
-  if (!gtk_widget_activate_action_variant (GTK_WIDGET (object), sig->action_name, sig->variant))
+  if (!gtk_widget_activate_action_variant (GTK_WIDGET (object), action, args))
     {
-      char *accelerator = gtk_accelerator_name (keyval, modifiers);
-      g_warning ("gtk_binding_entry_activate(): binding \"%s::%s\": "
-                 "action \"%s\" does not exist on class \"%s\"",
-                 set_name, accelerator,
-                 sig->action_name,
-                 G_OBJECT_TYPE_NAME (object));
-      g_free (accelerator);
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "action \"%s\" does not exist on class \"%s\"",
+                   action,
+                   G_OBJECT_TYPE_NAME (object));
       return FALSE;
     }
 
+  if (handled)
+    *handled = TRUE;
+
   return TRUE;
 }
 
@@ -821,10 +818,26 @@ gtk_binding_entry_activate (GtkBindingEntry *entry,
           break;
 
         case GTK_BINDING_ACTION:
-          handled = binding_signal_activate_action ((GtkBindingSignalAction *) sig,
-                                                    entry->binding_set->set_name,
-                                                    entry->keyval, entry->modifiers,
-                                                    object);
+          {
+            GtkBindingSignalAction *action = (GtkBindingSignalAction *) sig;
+            GError *error = NULL;
+            gboolean action_handled = FALSE;
+
+            if (gtk_binding_activate_action (object, action->action_name, action->variant, &action_handled, &error))
+              {
+                handled |= action_handled;
+              }
+            else
+              {
+                char *accelerator = gtk_accelerator_name (entry->keyval, entry->modifiers);
+                g_warning ("gtk_binding_entry_activate(): binding \"%s::%s\": %s",
+                           entry->binding_set->set_name,
+                           accelerator,
+                           error->message);
+                g_free (accelerator);
+                g_clear_error (&error);
+              }
+          }
           break;
 
         case GTK_BINDING_CALLBACK:
index 8fbccd2cdd0e970d7718d1cfe8a6fbecc61ce4cc..58ff6c96015657fd7774af4dd26bfbad31c07557 100644 (file)
@@ -30,6 +30,11 @@ gboolean gtk_binding_emit_signal     (GObject         *object,
                                       GVariant        *args,
                                       gboolean        *handled,
                                       GError         **error);
+gboolean gtk_binding_activate_action (GObject         *object,
+                                      const char      *action,
+                                      GVariant        *args,
+                                      gboolean        *handled,
+                                      GError         **error);
 
 G_END_DECLS